/**
 * @ignore 
 * @define 大量特效生成器
 */
namespace effect {

	export class Generator {

		private $container: egret.DisplayObjectContainer;
		private $mcList: any;
		private static $instance: Generator;
		private constructor() { this.$mcList = {}; };
		public static get instance(): Generator {
			if (!this.$instance) this.$instance = new Generator();
			return this.$instance;
		}

		/**
		 * 设置默认生成容器 Setter
		 * @param container 默认生成容器
		 * */
		public set container(container: egret.DisplayObjectContainer) { this.$container = container; }

		/**
		 * 获得默认生成容器 Getter
		 * @return 默认生成容器
		 * */
		public get container(): egret.DisplayObjectContainer { return this.$container; }

		/**
		 * 立刻在指定位置播放帧动画（动画被对象池管理，适合重复大量生成）
		 * @param x 在生成容器中的横轴位置
		 * @param y 在生成容器中的纵轴位置
		 * @param params 帧动画格式（所有参数均有效，请参考hjc.TMovieClip）
		 * @param container 是否单独指定容器 *默认无
		 * @return 生成帧动画
		 * */
		public playMcAt(x: number, y: number, params: hjc.McOptions, container?: egret.DisplayObjectContainer): egret.MovieClip {
			let resObj = this.$mcList[params.res];
			let movieList = resObj ? resObj[params.mc] : null;
			let mc: egret.MovieClip = null;
			if (!params.motion) params.motion = '';
			if (isArray(movieList) && movieList.length > 0) {
				mc = movieList.pop();
				mc.gotoAndPlay(params.motion, 1);
			} else {
				params.times = 1;
				mc = effect.createMc(params);
				ui.resetMcCenter(mc);
				mc.addEventListener(egret.Event.COMPLETE, () => {
					ui.remove(mc);
					this.$mcList[params.res][params.mc].push(mc);
				}, this);
			}
			mc.x = x;
			mc.y = y;
			if (container) container.addChild(mc);
			else {
				if (!this.$container) this.$container = game.layer.effect;
				this.$container.addChild(mc);
			}
			if (resObj && !isArray(movieList)) this.$mcList[params.res][params.mc] = [];
			if (!resObj) this.$mcList[params.res] = { [params.mc]: [] };
			return mc;
		}
	}
}